﻿#region << 版 本 注 释 >>
/*----------------------------------------------------------------
 * 版权所有 (c) 2022   保留所有权利。
 * CLR版本：4.0.30319.42000
 * 机器名称：DESKTOP-UL84BU5
 * 公司名称：
 * 命名空间：KingerRobot.WanliMDC.Biz
 * 唯一标识：24249019-4b0e-43cf-9e67-c03a7e5c182c
 * 文件名：LineBiz
 * 当前用户域：DESKTOP-UL84BU5
 * 
 * 创建者：zzl
 * 电子邮箱：1003590782@qq.com
 * 创建时间：2022/9/7 13:14:05
 * 版本：V1.0.0
 * 描述：
 *
 * ----------------------------------------------------------------
 * 修改人：
 * 时间：
 * 修改说明：
 *
 * 版本：V1.0.1
 *----------------------------------------------------------------*/
#endregion << 版 本 注 释 >>

namespace KingerRobot.MexicoSailunMDC.Biz;
/// <summary>
/// 重选入库口
/// </summary>

internal class LineCrnBiz : K8.MDCBB.Biz
{
    private const string ClassName = nameof(TemplateBiz);
    #region 配置参数
    private ParamData Param { get; set; }

    class ParamData
    {
        /// <summary>
        /// 重选入库口线体ID
        /// </summary>
        public long CrnLocId { get; set; }

        /// <summary>
        /// 线体编号
        /// </summary>
        public string StationNo { get; set; }

        /// <summary>
        /// 重选入库口线体名称
        /// </summary>
        public string CrnLocName { get; set; }
    }
    #endregion

    #region PLC 通讯参数
    private ValueData Data { get; set; }
    class ValueData
    {
        /// <summary>
        /// 产品条码
        /// </summary>
        public string ProductCode { get; set; }

        /// <summary>
        /// 线体流水号
        /// </summary>
        public int WorkNo { get; set; }
    }
    #endregion

    #region 缓存
    private CacheData Cache { get; set; }
    class CacheData
    {
        /// <summary>
        /// 条码
        /// </summary>
        public string ProductCode { get; set; }
    }
    #endregion

    #region 实时日志
    private StepData Step { get; set; }
    class StepData
    {
        private string _msg = string.Empty;
        public string StepMsg
        {
            get
            {
                return this._msg;
            }
            set
            {
                if (string.IsNullOrWhiteSpace(value))
                {
                    this._msg = string.Empty;
                    return;
                }
                this._msg = $"{ClassName}|{System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}>>{value}";
            }
        }
    }
    private void StepMsg(string msg)
    {
        this.Step.StepMsg = msg;
    }
    #endregion

    #region 文件日志（运行需要 Nlog 配置）
    private void WriteLog(string message)
    {
        K8.LSF.Client.Log(new K8.LSF.Log { Data = message });
    }
    #endregion

    /// <summary>
    /// 和 PLC 通讯对象
    /// </summary>
    private BizData BizData { get; set; }
    public int Execute(BizData writer)
    {
        // Excute 方法外使用 BizData
        this.BizData = writer;

        // 返回参数
        var result = 0;


        // 线体条码
        var productCode = Data.ProductCode;

        // 条码为空
        if (string.IsNullOrWhiteSpace(productCode))
        {
            this.StepMsg($"{productCode} 条码为空.");
            return result;
        }
        if (productCode.StartsWith(ConstFields.NoRead))
        {
            productCode = ConstFields.NoRead;
        }


        // 线体任务为：0
        var lineTaskNo = Data.WorkNo;
        if (lineTaskNo == 0)
        {
            this.StepMsg($"{lineTaskNo} 无任务流水号.");
            return result;
        }

        // 已扫描创建任务
        if (productCode == Cache.ProductCode)
        {
            this.StepMsg($"{productCode} 已执行.");

            return result;
        }

        // 是否重新选择入库口
        var positionService = K8.RSF.Client.Create<IPositionService>();
        var taskId = positionService.GetRcsLocationIsProductCode(Param.CrnLocId, productCode, lineTaskNo);

        if (taskId <= 0)
        {
            this.StepMsg($"{taskId} 不需要重新选择支线口.");
            return result;
        }

        // 指令下穿
        var taskService = K8.RSF.Client.Create<ITaskService>();
        var task = taskService.GetTaskByTaskId(taskId);
        if (task is null)
        {
            this.StepMsg($"{productCode}，任务未找到");
            return result;
        }


        if (task.CmdStatus == (int)EnumTaskCmdStatus.Executed)
        {
            this.StepMsg($"条码：{productCode},任务号：{lineTaskNo}，已执行");
            return result;
        }

        // 下发
        var mark = SetTaskInfo(task);
        this.StepMsg($"{lineTaskNo}，下发结果{mark}");
        if (mark > 0)
        {
            // 任务下传完成，修改标识
            mark = this.SetTaskFlag();

            if (mark > 0)
            {
                // 执行、保存缓存
                var service = K8.RSF.Client.Create<IWarehousingBeforeCrnService>();
                service.ExecuteTask(lineTaskNo, Param.CrnLocId);
                Cache.ProductCode = productCode;
            }
        }
        return result;

    }
    private int SetTaskInfo(BizTaskBean task)
    {
        return this.BizData.WriteData(new
        {
            Destination = task.TargetPlcLoc,        // 目标地址
            WorkNo = task.TaskNo,                   // 流水号
            OutSize = task.OutSize,                 // 外径
            //Start = task.StartCmdPlcLoc,            // 开始地址
            //CoupledNo = task.TaskGroup,             // 组
            //CoupledWorkNo = task.TaskGroupIndex,    // 顺序号
            //Height = task.Height,                   // 高
        });
    }

    private int SetTaskFlag()
    {
        var mark = this.BizData.WriteData(new
        {
            TaskFlag = EnumLineAck.WCSDownFinish,
        });
        Thread.Sleep(100);
        return mark;
    }
}
